// 1.字符串类型''."".``
let aName: string = '貂蝉'

// 2.数值类型
let dAge: number = 18
dAge = 18.13
dAge = -18

// 3.布尔值类型 true / false
let isSingDog: boolean = true
isSingDog = false
 
// isSingDog = 1

// 4.undefined 和 null

let und: undefined = undefined

let nul: null = null

//5. 数组
let arrjs = [1,'2',true,[],{}]
// let arr: string[] 
let arr:Array<String>
arr = ['1', '2']

let ageArr: Number[] = [1, 2, 3]

let numArr: Array<string> = ['1', '2']

// 6 元祖(tuple):就是一个已知元素数量和每个元素类型的数组,内部的元素类型 不必相同
let tup1: [string, number, boolean] = ['1', 1, true]
tup1[0] = '22222'
// tup1[1] = '2222' 报错
// tup1 = ['1',1,false,2] 报错
// 访问 元祖中元素 和 长度
console.log(tup1.length);
console.log(tup1[0]);


// 7枚举(enum):用一组标识 来 代表 数值,方便程序猿调用理解
// 7.1 创建性别枚举 
enum Gender{
  Boy,
  Girl,
  Uknown,
}
let userSex: Gender = Gender.Boy

console.log(userSex);


// 7.2 使用性别枚举


// 8.任意类型(any):可以用来代表任意类型,一般用来获取 dom 对象使用

let btn: any = document.getElementById('btn')


// 9.空类型(void):可以用来表示函数的无返回值

function say(): void{
  console.log(11111);
  
}


// 11.其他类型(never):可以用来表示不会出现的值 - 常用在 有抛出异常 或 无限循环的函数 返回值类型声明处
// 补充:never类型是Ts中的底部类型,所有类型都是never类型的父类
// 所以never类型值可以赋值给任意类型的变量

function test(): never{
  while (true) {
    
  }
}

function test2(): never{
 throw new Error('哈哈')
}

let x: never = test()

let y: string = test()

// 类型推断
// 概念:如果变量的声明和初始化是在同一行,可以省略掉变量的类型的声明

let a = 13 
// a= 'sss' 报错

// 联合类型
// 概念: 表示取值可以为多种类型中的一种

let lianhe: number | string = 123

lianhe = 'www'

// 案例
// prompt函数的返回值可能是字符串也可能是null

let mName: string | null = prompt("你输入小狗狗的名字")
console.log(mName);
